<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
</head>
<body>
	<script>
		//new运算符4个步骤
		var A = {n:4399};
		var B = function(){this.n = 9999;}
		var C = function(){var n = 8888;}//这里的n只是函数里面的一个局部变量而已
		B.prototype=A;
		C.prototype=A;
		var b = new B();
		var c = new C();
		A.n++;
		console.log(b.n);
		console.log(c.n);
		//new运算的具体过程：
		//1）创建一个空对象即new Object()
		//2）把这个空对象的__proto__指向构造函数的prototype（构造函数的原型对象）
		//3）把这个空对象赋值给this即构造函数的作用域赋给新对象
		//4）执行构造函数内部的代码，返回新对象   注意此时的this指向新对象，this.n=9999等价于b.n=9999;
		//然后访问b.n,存在，直接输出b.n
		//再去访问c.n，不存在，通过原型链_protype_,c._proto_指向C.prototype也就是A，所以就是输出A.n
		//
		//
		//JavaScript高级程序设计第三版
		//使用new操作符，调用构造函数创建实例经历以下4个步骤：
		//1. 创建一个新对象
		//2. 将构造函数的作用域赋给新对象（因此this就指向了这个新对象）
		//3. 执行构造函数中的代码（为这个新对象添加属性）
		//4. 返回新对象
		//
		//记忆版：空对象->加工->加工后的新对象
		//1. 创建一个空对象
		//2. 空对象的__proto__指向构造函数的原型对象，构造函数中的this执行这个空对象
		//3. 执行构造函数，加工步骤1创建的空对象
		//4. return 加工好的对象
	</script>
</body>
</html>